package me.ydq.core.table;

import me.ydq.mapper.Mapping;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SingleColumnRowMapper;

import java.util.Objects;
import java.util.Optional;

/**
 * 查询满足条件的 top1 的数据，如果没有 则返回 Optional.empty() 如果有多个也不报错
 */
public interface TableFirst<T> extends TableList<T> {

    default Optional<T> first() {
        return first(rowMapper());
    }

    default <R> Optional<R> first(RowMapper<R> rowMapper) {
        return list(0, 1, rowMapper).stream().filter(Objects::nonNull).findFirst();
    }

    /**
     * 适合于查询类似于 distinct x 这样的字段
     */
    default <R> Optional<R> first(Mapping<R> mapping) {
        return list(0, 1, (rs, i) -> mapping.map(rs)).stream().filter(Objects::nonNull).findFirst();
    }

    /**
     * 适合于查询类似于 distinct x 这样的字段
     */
    default <R> Optional<R> first(Class<R> returnType) {
        return list(0, 1, new SingleColumnRowMapper<>(returnType)).stream().filter(Objects::nonNull).findFirst();
    }
}
